home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / IOLib / stdio / fread.c < prev    next >
C/C++ Source or Header  |  1989-06-15  |  780b  |  50 lines

  1. #include <stdio.h>
  2.  
  3. int
  4. fread(buf, size, number, fi)
  5.     char  *buf;
  6.     int    size;
  7.     int   number;
  8.     register FILE  *fi;
  9. {
  10.     register long   r, rr, m, n;
  11.  
  12.     r = (fi->_flag &= ~_IORW);
  13.     if(!(r & _IOREAD) || (r & (_IOERR | _IOEOF)))
  14.         return(EOF);
  15.     if(fi->_base == NULL)    /* allocate a buffer if there wasn't one */
  16.         _getbuf(fi);
  17.  
  18.     rr = 0;
  19.     n = size * number;
  20.  
  21.     for (;;) {
  22.         r = fi->_cnt;
  23.         if (r > n)
  24.             r = n;
  25.         if (r) {
  26.             (void)lmemcpy( buf, fi->_ptr, r ); 
  27.             buf += r;
  28.             n -= r;
  29.             rr += r;
  30.             fi->_cnt -= r;
  31.         }
  32.  
  33.         if (n) {
  34.             m = read(fi->_file, fi->_base, fi->_bsiz);
  35.             if(m <= 0){
  36.                 fi->_flag |= ((m == 0) ? _IOEOF : _IOERR);
  37.                 if ( m < 0 )
  38.                     return EOF;
  39.             }
  40.  
  41.             fi->_cnt = m;
  42.             fi->_ptr = fi->_base;
  43.             if ( m > 0 )
  44.                 continue;
  45.         }
  46.         break;
  47.     }
  48.     return (rr / size );
  49. }
  50.